package com.xzzz.irda.tracker.core.adapter.gateway;

public class TrackerTransformer {

//    static class TrackerReactorTransformer<T> implements Function<Publisher<T>, Publisher<T>> {
//        private final String traceName;
//        private final String traceId;
//        private final String spanParentId;
//
//        public TrackerReactorTransformer(String traceName, String traceId, String spanParentId) {
//            this.traceName = traceName;
//            this.traceId = traceId;
//            this.spanParentId = spanParentId;
//        }
//
//        @Override
//        public Publisher<T> apply(Publisher<T> publisher) {
//            if (publisher instanceof Mono) {
//                return new MonoTrackerOperator<>((Mono<T>) publisher, traceName, traceId, spanParentId);
//            }
//            if (publisher instanceof Flux) {
//                return new FluxTrackerOperator<>((Flux<T>) publisher, traceName, traceId, spanParentId);
//            }
//            return publisher;
//        }
//    }
//
//    /**
//     * flux 处理
//     */
//    static class MonoTrackerOperator<T> extends MonoOperator<T, T> {
//        private final String traceName;
//        private final String traceId;
//        private final String spanParentId;
//
//        public MonoTrackerOperator(Mono<? extends T> source, String traceName, String traceId, String spanParentId) {
//            super(source);
//            this.traceName = traceName;
//            this.traceId = traceId;
//            this.spanParentId = spanParentId;
//        }
//
//        @Override
//        public void subscribe(CoreSubscriber<? super T> actual) {
//            source.subscribe(new TrackerReactorSubscriber<>(actual, traceName, traceId, spanParentId));
//        }
//    }
//
//    /**
//     * flux 处理
//     */
//    static class FluxTrackerOperator<T> extends FluxOperator<T, T> {
//        private final String traceName;
//        private String traceId;
//        private String spanParentId;
//
//        public FluxTrackerOperator(Flux<? extends T> source, String traceName, String traceId, String spanParentId) {
//            super(source);
//            this.traceName = traceName;
//            this.traceId = traceId;
//            this.spanParentId = spanParentId;
//        }
//
//        @Override
//        public void subscribe(CoreSubscriber<? super T> actual) {
//            source.subscribe(new TrackerReactorSubscriber<>(actual, traceName, traceId, spanParentId));
//        }
//    }
//
//    /**
//     * SentinelReactorSubscriber
//     */
//    @Slf4j
//    static class TrackerReactorSubscriber<T> extends BaseSubscriber<T> {
//        private final CoreSubscriber<? super T> actual;
//        private final String traceName;
//        private final String traceId;
//        private final String spanParentId;
//
//        public TrackerReactorSubscriber(CoreSubscriber<? super T> actual, String traceName, String traceId, String spanParentId) {
//            this.actual = actual;
//            this.traceName = traceName;
//            this.traceId = traceId;
//            this.spanParentId = spanParentId;
//        }
//
//        private void test(Runnable f) {
//            log.warn("test");
//            f.run();
//        }
//
//        @Override
//        protected void hookOnSubscribe(Subscription subscription) {
//            try {
//                actual.onSubscribe(this);
//                log.warn("2. hookOnSubscribe > {} > {}", traceId, subscription.toString());
//            } catch (Exception e) {
//                log.error(e.getMessage());
//            } finally {
//                log.warn("2. hookOnSubscribe finally");
//            }
//        }
//
//        @Override
//        public Context currentContext() {
//            log.warn("3. currentContext > {} > {}", traceId, actual.currentContext().toString());
//            return actual.currentContext();
//        }
//
//        @Override
//        protected void hookOnComplete() {
//            log.warn("4. hookOnComplete > {}", traceId);
//            actual.onComplete();
//        }
//
//        @Override
//        protected void hookFinally(SignalType type) {
//            super.hookFinally(type);
//            log.warn("5. hookFinally > {} > {}", traceId, type.toString());
//        }
//
//
//        @Override
//        protected void hookOnError(Throwable throwable) {
//            super.hookOnError(throwable);
//            System.out.println("?. hookOnError >" + Thread.currentThread().getName());
//        }
//
//        @Override
//        protected void hookOnCancel() {
//            super.hookOnCancel();
//            System.out.println("?. hookOnCancel >" + Thread.currentThread().getName());
//        }
//
//        @Override
//        protected void hookOnNext(T value) {
////            super.hookOnNext(value);
//            actual.onNext(value);
//            System.out.println("?. hookOnNext >" + Thread.currentThread().getName());
//        }
//    }
}
